feat(confluence): add confluence plugin for page management and doc g…#452
feat(confluence): add confluence plugin for page management and doc g…#452mmorency2021 wants to merge 3 commits into
Conversation
|
Hi @mmorency2021. Thanks for your PR. I'm waiting for a openshift-eng member to verify that this patch is reasonable to test. If it is, they should reply with Regular contributors should join the org to skip this step. Once the patch is verified, the new status will be reflected by the I understand the commands that are listed here. DetailsInstructions for interacting with me using PR comments are available here. If you have questions or suggestions related to my behavior, please file an issue against the kubernetes-sigs/prow repository. |
WalkthroughAdds a new Confluence plugin (version 0.1.0): marketplace registration and manifest, README, three command docs, two skills (page templates and conventions), and evaluation suites for each command. ChangesConfluence Plugin
Estimated code review effort🎯 3 (Moderate) | ⏱️ ~20 minutes Suggested labels
Suggested reviewers
🚥 Pre-merge checks | ✅ 10✅ Passed checks (10 passed)
✏️ Tip: You can configure your own custom pre-merge checks in the settings. ✨ Finishing Touches🧪 Generate unit tests (beta)
Thanks for using CodeRabbit! It's free for OSS, and your support helps us grow. If you like it, consider giving us a shout-out. Comment |
There was a problem hiding this comment.
Actionable comments posted: 5
🤖 Prompt for all review comments with AI agents
Verify each finding against current code. Fix only still-valid issues, skip the
rest with a brief reason, keep changes minimal, and validate.
Inline comments:
In `@PLUGINS.md`:
- Around line 118-127: Update the Confluence create-from-jira command
documentation to include "decision-record" as a valid --type option: add
decision-record to the Synopsis line in PLUGINS.md where the create-from-jira
command lists `design-doc|feature-spec|runbook`, and apply the same change to
the create-from-jira docs by updating the argument-hint frontmatter and the
Synopsis code block in plugins/confluence/commands/create-from-jira.md so the
--type values read `design-doc|feature-spec|runbook|decision-record`
consistently.
In `@plugins/confluence/commands/sync-meeting-notes.md`:
- Around line 118-138: Add blank lines before and after each Markdown table to
satisfy MD058 by inserting an empty line above the "Arguments" table (the table
under the "## Arguments" heading) and an empty line below it, and likewise
insert an empty line above and below the "Error Handling" table (the table under
the "## Error Handling" heading); ensure both tables are separated from
surrounding headings and paragraphs by one blank line each so markdownlint no
longer flags them.
- Around line 10-12: Add a language specifier to the fenced code block that
shows the command usage for /confluence:sync-meeting-notes so the static
analyzer stops flagging it; locate the fence containing
"/confluence:sync-meeting-notes <space-key> <title> [--parent-id <id>] [--update
<page-id>]" and change the opening triple backticks to include a language token
such as "text" or "bash" (e.g., ```text).
- Around line 89-98: Replace the hardcoded label name in the
mcp__mcp-atlassian__confluence_add_label call: do not pass the literal
"meeting-2026-05"; instead use a dynamic label like "meeting-<YYYY-MM>" and
update the surrounding prose to instruct computing the current year-month at
runtime (derive from current date/time in the runtime language before calling
mcp__mcp-atlassian__confluence_add_label so each page gets a label based on the
actual meeting date).
- Around line 100-116: Add a language specifier ("bash" or "shell") to each of
the three fenced code blocks in the Usage Examples so markdownlint MD040 is
satisfied; specifically update the three blocks containing the shell commands
(/jira:grooming ... /confluence:sync-meeting-notes ...) so their opening fences
read ```bash instead of ``` for the examples that include the /jira:grooming and
the two /confluence:sync-meeting-notes commands.
🪄 Autofix (Beta)
Fix all unresolved CodeRabbit comments on this PR:
- Push a commit to this branch (recommended)
- Create a new PR with the fixes
ℹ️ Review info
⚙️ Run configuration
Configuration used: Path: .coderabbit.yaml
Review profile: CHILL
Plan: Enterprise
Run ID: 5b776576-a103-4d13-ba64-0e9b3afb7d45
📒 Files selected for processing (10)
.claude-plugin/marketplace.jsonPLUGINS.mddocs/data.jsonplugins/confluence/.claude-plugin/plugin.jsonplugins/confluence/README.mdplugins/confluence/commands/create-from-jira.mdplugins/confluence/commands/search.mdplugins/confluence/commands/sync-meeting-notes.mdplugins/confluence/skills/confluence-conventions/SKILL.mdplugins/confluence/skills/page-templates/SKILL.md
| ### Confluence Plugin | ||
|
|
||
| Confluence page management, documentation generation from Jira, and meeting notes publishing | ||
|
|
||
| **Commands:** | ||
| - **`/confluence:create-from-jira` `<issue-key> [--space <key>] [--parent-id <id>] [--type design-doc|feature-spec|runbook]`** - Generate a structured Confluence page from a Jira epic or story | ||
| - **`/confluence:search` `<query> [--space <key>] [--limit <n>]`** - Search Confluence for related documentation using natural language or CQL | ||
| - **`/confluence:sync-meeting-notes` `<space-key> <title> [--parent-id <id>] [--update <page-id>]`** - Publish meeting notes or agendas to Confluence with structured formatting | ||
|
|
||
| See [plugins/confluence/README.md](plugins/confluence/README.md) for detailed documentation. |
There was a problem hiding this comment.
decision-record is missing from the --type synopsis here and in create-from-jira.md.
Line 123 lists design-doc|feature-spec|runbook as the valid --type values, but both the create-from-jira command's Arguments table (line 120 of that file) and its Phase 3 implementation explicitly include decision-record as a fourth valid type. This discrepancy can mislead users into never passing --type decision-record directly.
The same truncation appears in three places: the frontmatter argument-hint, the Synopsis section of create-from-jira.md, and here in PLUGINS.md.
📝 Proposed fix
-**`/confluence:create-from-jira` `<issue-key> [--space <key>] [--parent-id <id>] [--type design-doc|feature-spec|runbook]`**
+**`/confluence:create-from-jira` `<issue-key> [--space <key>] [--parent-id <id>] [--type design-doc|feature-spec|runbook|decision-record]`**Apply the same fix to the argument-hint frontmatter and the Synopsis code block in plugins/confluence/commands/create-from-jira.md.
🤖 Prompt for AI Agents
Verify each finding against current code. Fix only still-valid issues, skip the
rest with a brief reason, keep changes minimal, and validate.
In `@PLUGINS.md` around lines 118 - 127, Update the Confluence create-from-jira
command documentation to include "decision-record" as a valid --type option: add
decision-record to the Synopsis line in PLUGINS.md where the create-from-jira
command lists `design-doc|feature-spec|runbook`, and apply the same change to
the create-from-jira docs by updating the argument-hint frontmatter and the
Synopsis code block in plugins/confluence/commands/create-from-jira.md so the
--type values read `design-doc|feature-spec|runbook|decision-record`
consistently.
| ``` | ||
| /confluence:sync-meeting-notes <space-key> <title> [--parent-id <id>] [--update <page-id>] | ||
| ``` |
There was a problem hiding this comment.
Add a language specifier to the Synopsis fenced code block.
The static analysis tool flags this block for missing a language tag. Using text or bash will silence the warning.
🔧 Proposed fix
-```
+```text
/confluence:sync-meeting-notes <space-key> <title> [--parent-id <id>] [--update <page-id>]</details>
<!-- suggestion_start -->
<details>
<summary>📝 Committable suggestion</summary>
> ‼️ **IMPORTANT**
> Carefully review the code before committing. Ensure that it accurately replaces the highlighted code, contains no missing lines, and has no issues with indentation. Thoroughly test & benchmark the code to ensure it meets the requirements.
```suggestion
🧰 Tools
🪛 markdownlint-cli2 (0.22.1)
[warning] 10-10: Fenced code blocks should have a language specified
(MD040, fenced-code-language)
🤖 Prompt for AI Agents
Verify each finding against current code. Fix only still-valid issues, skip the
rest with a brief reason, keep changes minimal, and validate.
In `@plugins/confluence/commands/sync-meeting-notes.md` around lines 10 - 12, Add
a language specifier to the fenced code block that shows the command usage for
/confluence:sync-meeting-notes so the static analyzer stops flagging it; locate
the fence containing "/confluence:sync-meeting-notes <space-key> <title>
[--parent-id <id>] [--update <page-id>]" and change the opening triple backticks
to include a language token such as "text" or "bash" (e.g., ```text).
| ### Phase 6: Apply Labels and Report | ||
| 1. Add date-based label: | ||
| ```python | ||
| mcp__mcp-atlassian__confluence_add_label( | ||
| page_id="<page-id>", | ||
| name="meeting-2026-05" | ||
| ) | ||
| ``` | ||
| 2. Add a `meeting-notes` label for discoverability. | ||
| 3. Report the page URL and summary of extracted items (action count, decision count). |
There was a problem hiding this comment.
Hardcoded date label meeting-2026-05 will go stale and may mislead the AI agent.
The Phase 6 code snippet passes the literal string "meeting-2026-05" as the label name. If the AI model follows the example literally rather than deriving the date from the current date, all pages will receive the same stale label. Replace the hardcoded value with a dynamic placeholder and add a prose instruction to compute it at runtime.
🔧 Proposed fix
1. Add date-based label:
```python
mcp__mcp-atlassian__confluence_add_label(
page_id="<page-id>",
- name="meeting-2026-05"
+ name="meeting-<YYYY-MM>" # derive from current date at runtime
)
```🤖 Prompt for AI Agents
Verify each finding against current code. Fix only still-valid issues, skip the
rest with a brief reason, keep changes minimal, and validate.
In `@plugins/confluence/commands/sync-meeting-notes.md` around lines 89 - 98,
Replace the hardcoded label name in the mcp__mcp-atlassian__confluence_add_label
call: do not pass the literal "meeting-2026-05"; instead use a dynamic label
like "meeting-<YYYY-MM>" and update the surrounding prose to instruct computing
the current year-month at runtime (derive from current date/time in the runtime
language before calling mcp__mcp-atlassian__confluence_add_label so each page
gets a label based on the actual meeting date).
| ## Usage Examples | ||
|
|
||
| 1. **Publish grooming notes after running `/jira:grooming`:** | ||
| ``` | ||
| /jira:grooming PROJ sprint-42 | ||
| /confluence:sync-meeting-notes TEAM "Sprint 42 Grooming - 2026-05-07" | ||
| ``` | ||
|
|
||
| 2. **Create meeting notes under a specific parent:** | ||
| ``` | ||
| /confluence:sync-meeting-notes DEV "Architecture Review - 2026-05-07" --parent-id 123456789 | ||
| ``` | ||
|
|
||
| 3. **Update an existing meeting page with new notes:** | ||
| ``` | ||
| /confluence:sync-meeting-notes TEAM "Weekly Standup" --update 987654321 | ||
| ``` |
There was a problem hiding this comment.
Add language specifiers to all three usage-example fenced code blocks.
Lines 103, 109, and 114 are flagged by markdownlint (MD040). All three contain shell commands; use bash (or shell).
🔧 Proposed fix
- ```
+ ```bash
/jira:grooming PROJ sprint-42
/confluence:sync-meeting-notes TEAM "Sprint 42 Grooming - 2026-05-07"
```
- ```
+ ```bash
/confluence:sync-meeting-notes DEV "Architecture Review - 2026-05-07" --parent-id 123456789
```
- ```
+ ```bash
/confluence:sync-meeting-notes TEAM "Weekly Standup" --update 987654321
```🧰 Tools
🪛 markdownlint-cli2 (0.22.1)
[warning] 103-103: Fenced code blocks should have a language specified
(MD040, fenced-code-language)
[warning] 109-109: Fenced code blocks should have a language specified
(MD040, fenced-code-language)
[warning] 114-114: Fenced code blocks should have a language specified
(MD040, fenced-code-language)
🤖 Prompt for AI Agents
Verify each finding against current code. Fix only still-valid issues, skip the
rest with a brief reason, keep changes minimal, and validate.
In `@plugins/confluence/commands/sync-meeting-notes.md` around lines 100 - 116,
Add a language specifier ("bash" or "shell") to each of the three fenced code
blocks in the Usage Examples so markdownlint MD040 is satisfied; specifically
update the three blocks containing the shell commands (/jira:grooming ...
/confluence:sync-meeting-notes ...) so their opening fences read ```bash instead
of ``` for the examples that include the /jira:grooming and the two
/confluence:sync-meeting-notes commands.
|
can someone give ok-to-test for this PR ? @theobarberbany @bentito |
|
/ok-to-test |
|
Since all tests are successful , can someone approve the PR so it can be merged? @theobarberbany @bentito |
|
I think this is a good, non-redundant PR. We just recently added some evals with promptfoo. Could you add a couple happy path evals that will help answer any other questions I might have? #464 adds the promptfoo machinery. You just need to add |
…eneration New plugin with 3 commands and 2 skills for Confluence integration: - create-from-jira: generate structured pages from Jira epics/stories - search: find related docs using natural language, CQL, or issue keys - sync-meeting-notes: publish meeting notes and agendas to Confluence
e1bee26 to
811e069
Compare
|
[APPROVALNOTIFIER] This PR is APPROVED This pull-request has been approved by: mmorency2021 The full list of commands accepted by this bot can be found here. The pull request process is described here DetailsNeeds approval from an approver in each of these files:Approvers can indicate their approval by writing |
There was a problem hiding this comment.
Actionable comments posted: 7
🧹 Nitpick comments (1)
plugins/confluence/commands/search.md (1)
33-35: ⚡ Quick winRaw-CQL detection is too broad and can catch normal language accidentally.
Using presence of
AND/ORas a raw-CQL signal (Line 34) can misroute plain English queries. Consider tightening this rule (e.g., require CQL field/operator patterns) before pass-through.🤖 Prompt for AI Agents
Verify each finding against current code. Fix only still-valid issues, skip the rest with a brief reason, keep changes minimal, and validate. In `@plugins/confluence/commands/search.md` around lines 33 - 35, The Raw-CQL detection rule that treats presence of "AND"/"OR" as sufficient should be tightened in the search parsing logic (the function that decides "raw CQL" / "pass-through", e.g., isRawCql or detectRawCql used in the Confluence query parser) by requiring explicit CQL field/operator patterns before allowing pass-through; update the check to only classify as raw CQL when the input contains CQL-style tokens such as a field+operator pattern (examples: "field =", "field ~", "field :", or "field IN") or matches a regex like <field>\s*(=|~|:|IN)\s*<value>, while still allowing Jira-key detection and natural-language fallback otherwise.
🤖 Prompt for all review comments with AI agents
Verify each finding against current code. Fix only still-valid issues, skip the
rest with a brief reason, keep changes minimal, and validate.
Inline comments:
In `@docs/data.json`:
- Around line 1808-1813: Update the "description" field for the command named
"sync-meeting-notes" in the data.json entry so it explicitly states where the
meeting content is sourced from (e.g., conversation context, grooming output, or
files). Locate the object with "name": "sync-meeting-notes" and replace the
current description value with a clarified sentence such as "Publish meeting
notes or agendas from conversation context (or grooming output or files) to
Confluence with structured formatting" to improve discoverability.
In `@plugins/confluence/commands/create-from-jira.md`:
- Line 3: Update the user-facing `--type` option list in the command argument
hints to include the missing `decision-record` entry; specifically modify the
`argument-hint` occurrences in create-from-jira.md so the `--type` choices read
"design-doc|feature-spec|runbook|decision-record" (update both places where the
hint appears, e.g., the top-level `argument-hint` and the later occurrence
around line 11) to keep the displayed syntax consistent with the command
description and allowed arguments.
- Around line 10-12: The markdown in
plugins/confluence/commands/create-from-jira.md has unlabeled fenced code blocks
and tables without surrounding blank lines; update each fenced block (e.g., the
command usage block "/confluence:create-from-jira <issue-key> [...]") to include
an appropriate language tag such as bash or text to satisfy MD040/MD058, and
ensure every table block has a blank line before and after it (matching the
format used in plugins/hello-world/commands/echo.md); apply these fixes
consistently to all affected sections mentioned in the review so the linter
passes.
In `@plugins/confluence/commands/search.md`:
- Around line 10-12: The command docs for /confluence:search currently fail
markdownlint MD040/MD058 because the usage code block lacks a fenced language
and the Arguments/Error Handling tables need surrounding blank lines; update the
usage block to use a fenced language (e.g., ```bash) and add a blank line before
and after each table (Arguments, Error Handling) for the /confluence:search
command and the other affected sections (lines referenced 64-74, 81-98, 101-105,
113-117), matching the structure used in plugins/hello-world/commands/echo.md so
the linter passes.
In `@plugins/confluence/evals/sync-meeting-notes.yaml`:
- Around line 41-44: The example meeting-note lines contain real person names;
update the fixture in sync-meeting-notes.yaml to use role-based placeholders
instead (e.g., replace "Attendees: Alice, Bob, Carol" with "Attendees: Product
Manager, Backend Engineer, Designer", change "Discussion: finalize architecture
decision for release" to remain but ensure roles are used in actions and
decisions such as "Actions: Backend Engineer to update the design doc", and
likewise replace any other named references in the same block so all
attendees/action owners are roles rather than personal names.
In `@plugins/confluence/skills/confluence-conventions/SKILL.md`:
- Around line 40-47: Two Markdown tables (one starting with the header "|
Content Type | Required Labels | Optional Labels |" and the other the second
table referenced in the comment) lack surrounding blank lines and trigger MD058;
fix by adding a single blank line both immediately before and immediately after
each table so each table is separated from surrounding paragraphs and headings.
Ensure you update the blocks that include the "| Content Type | Required Labels
| Optional Labels |" header and the other table block so there is exactly one
blank line above and one blank line below each table.
In `@plugins/confluence/skills/page-templates/SKILL.md`:
- Around line 162-163: The example uses real-person names; replace them with
neutral role-based placeholders. In SKILL.md update the sample meeting lines
that read "Attendees: Alice, Bob, Carol" and "Facilitator: Alice" (and the
similar occurrence at the later block) to role placeholders such as "Attendees:
Product Manager, Engineer, Designer" and "Facilitator: Product Manager" (or
"Attendee 1, Attendee 2, Attendee 3" / "Facilitator: Attendee 1") so no real
names appear.
---
Nitpick comments:
In `@plugins/confluence/commands/search.md`:
- Around line 33-35: The Raw-CQL detection rule that treats presence of
"AND"/"OR" as sufficient should be tightened in the search parsing logic (the
function that decides "raw CQL" / "pass-through", e.g., isRawCql or detectRawCql
used in the Confluence query parser) by requiring explicit CQL field/operator
patterns before allowing pass-through; update the check to only classify as raw
CQL when the input contains CQL-style tokens such as a field+operator pattern
(examples: "field =", "field ~", "field :", or "field IN") or matches a regex
like <field>\s*(=|~|:|IN)\s*<value>, while still allowing Jira-key detection and
natural-language fallback otherwise.
🪄 Autofix (Beta)
Fix all unresolved CodeRabbit comments on this PR:
- Push a commit to this branch (recommended)
- Create a new PR with the fixes
ℹ️ Review info
⚙️ Run configuration
Configuration used: Path: .coderabbit.yaml
Review profile: CHILL
Plan: Enterprise
Run ID: 1ff1cab5-cd5e-4215-9af1-fcec7e9cddd3
📒 Files selected for processing (12)
.claude-plugin/marketplace.jsondocs/data.jsonplugins/confluence/.claude-plugin/plugin.jsonplugins/confluence/README.mdplugins/confluence/commands/create-from-jira.mdplugins/confluence/commands/search.mdplugins/confluence/commands/sync-meeting-notes.mdplugins/confluence/evals/create-from-jira.yamlplugins/confluence/evals/search.yamlplugins/confluence/evals/sync-meeting-notes.yamlplugins/confluence/skills/confluence-conventions/SKILL.mdplugins/confluence/skills/page-templates/SKILL.md
✅ Files skipped from review due to trivial changes (4)
- plugins/confluence/evals/create-from-jira.yaml
- .claude-plugin/marketplace.json
- plugins/confluence/.claude-plugin/plugin.json
- plugins/confluence/README.md
| { | ||
| "argument_hint": "<space-key> <title> [--parent-id <id>] [--update <page-id>]", | ||
| "description": "Publish meeting notes or agendas to Confluence with structured formatting", | ||
| "name": "sync-meeting-notes", | ||
| "synopsis": "/confluence:sync-meeting-notes <space-key> <title> [--parent-id <id>] [--update <page-id>]" | ||
| } |
There was a problem hiding this comment.
🧩 Analysis chain
🏁 Script executed:
#!/bin/bash
# Check sync-meeting-notes command implementation for content input handling
fd -t f 'sync-meeting-notes.md' plugins/confluence/commands/ --exec cat {}Repository: openshift-eng/ai-helpers
Length of output: 5834
Clarify the content source in command metadata.
The sync-meeting-notes command signature doesn't indicate where the meeting content comes from. While the full implementation documentation clearly explains that content defaults to conversation context (with fallback to user input or files), the data.json metadata entry should hint at this for better discoverability.
Update the description to clarify the content source:
"description": "Publish meeting notes or agendas from conversation context to Confluence with structured formatting"Or reference the content sources more explicitly:
"description": "Publish meeting notes or agendas (from conversation context, grooming output, or files) to Confluence with structured formatting"🤖 Prompt for AI Agents
Verify each finding against current code. Fix only still-valid issues, skip the
rest with a brief reason, keep changes minimal, and validate.
In `@docs/data.json` around lines 1808 - 1813, Update the "description" field for
the command named "sync-meeting-notes" in the data.json entry so it explicitly
states where the meeting content is sourced from (e.g., conversation context,
grooming output, or files). Locate the object with "name": "sync-meeting-notes"
and replace the current description value with a clarified sentence such as
"Publish meeting notes or agendas from conversation context (or grooming output
or files) to Confluence with structured formatting" to improve discoverability.
| @@ -0,0 +1,139 @@ | |||
| --- | |||
| description: Generate a structured Confluence page from a Jira epic or story | |||
| argument-hint: "<issue-key> [--space <key>] [--parent-id <id>] [--type design-doc|feature-spec|runbook]" | |||
There was a problem hiding this comment.
--type option list is incomplete in user-facing command syntax.
Line 3 and Line 11 omit decision-record, but the command description and arguments later allow it. Please keep all entry points consistent.
Suggested fix
-argument-hint: "<issue-key> [--space <key>] [--parent-id <id>] [--type design-doc|feature-spec|runbook]"
+argument-hint: "<issue-key> [--space <key>] [--parent-id <id>] [--type design-doc|feature-spec|runbook|decision-record]"
...
-/confluence:create-from-jira <issue-key> [--space <key>] [--parent-id <id>] [--type design-doc|feature-spec|runbook]
+/confluence:create-from-jira <issue-key> [--space <key>] [--parent-id <id>] [--type design-doc|feature-spec|runbook|decision-record]As per coding guidelines "Follow existing command format patterns documented in plugins/hello-world/commands/echo.md and ensure the linter enforces structure".
Also applies to: 11-11
🤖 Prompt for AI Agents
Verify each finding against current code. Fix only still-valid issues, skip the
rest with a brief reason, keep changes minimal, and validate.
In `@plugins/confluence/commands/create-from-jira.md` at line 3, Update the
user-facing `--type` option list in the command argument hints to include the
missing `decision-record` entry; specifically modify the `argument-hint`
occurrences in create-from-jira.md so the `--type` choices read
"design-doc|feature-spec|runbook|decision-record" (update both places where the
hint appears, e.g., the top-level `argument-hint` and the later occurrence
around line 11) to keep the displayed syntax consistent with the command
description and allowed arguments.
| ``` | ||
| /confluence:create-from-jira <issue-key> [--space <key>] [--parent-id <id>] [--type design-doc|feature-spec|runbook] | ||
| ``` |
There was a problem hiding this comment.
Fix markdownlint issues (MD040/MD058) in command docs.
Line 10/100/105/110 fenced blocks are missing language tags, and table blocks around Line 115 and Line 128 need surrounding blank lines.
As per coding guidelines "Follow existing command format patterns documented in plugins/hello-world/commands/echo.md and ensure the linter enforces structure".
Also applies to: 100-112, 115-121, 128-133
🧰 Tools
🪛 markdownlint-cli2 (0.22.1)
[warning] 10-10: Fenced code blocks should have a language specified
(MD040, fenced-code-language)
🤖 Prompt for AI Agents
Verify each finding against current code. Fix only still-valid issues, skip the
rest with a brief reason, keep changes minimal, and validate.
In `@plugins/confluence/commands/create-from-jira.md` around lines 10 - 12, The
markdown in plugins/confluence/commands/create-from-jira.md has unlabeled fenced
code blocks and tables without surrounding blank lines; update each fenced block
(e.g., the command usage block "/confluence:create-from-jira <issue-key> [...]")
to include an appropriate language tag such as bash or text to satisfy
MD040/MD058, and ensure every table block has a blank line before and after it
(matching the format used in plugins/hello-world/commands/echo.md); apply these
fixes consistently to all affected sections mentioned in the review so the
linter passes.
| ``` | ||
| /confluence:search <query> [--space <key>] [--limit <n>] | ||
| ``` |
There was a problem hiding this comment.
Address markdownlint MD040/MD058 in this command doc.
Add fenced code languages and blank lines around the Arguments/Error Handling tables.
As per coding guidelines "Follow existing command format patterns documented in plugins/hello-world/commands/echo.md and ensure the linter enforces structure".
Also applies to: 64-74, 81-98, 101-105, 113-117
🧰 Tools
🪛 markdownlint-cli2 (0.22.1)
[warning] 10-10: Fenced code blocks should have a language specified
(MD040, fenced-code-language)
🤖 Prompt for AI Agents
Verify each finding against current code. Fix only still-valid issues, skip the
rest with a brief reason, keep changes minimal, and validate.
In `@plugins/confluence/commands/search.md` around lines 10 - 12, The command docs
for /confluence:search currently fail markdownlint MD040/MD058 because the usage
code block lacks a fenced language and the Arguments/Error Handling tables need
surrounding blank lines; update the usage block to use a fenced language (e.g.,
```bash) and add a blank line before and after each table (Arguments, Error
Handling) for the /confluence:search command and the other affected sections
(lines referenced 64-74, 81-98, 101-105, 113-117), matching the structure used
in plugins/hello-world/commands/echo.md so the linter passes.
| | Content Type | Required Labels | Optional Labels | | ||
| |-------------|----------------|-----------------| | ||
| | Design Document | `design-doc` | component name, team name | | ||
| | Feature Spec | `feature-spec` | component name, version | | ||
| | Meeting Notes | `meeting-notes`, `meeting-YYYY-MM` | team name, meeting type | | ||
| | Runbook | `runbook` | service name, severity | | ||
| | Decision Record | `decision-record` | status (`accepted`, `proposed`) | | ||
|
|
There was a problem hiding this comment.
Add blank lines around both tables to satisfy MD058.
The tables starting at Line 40 and Line 80 should be separated from surrounding text by blank lines.
Also applies to: 80-87
🧰 Tools
🪛 markdownlint-cli2 (0.22.1)
[warning] 40-40: Tables should be surrounded by blank lines
(MD058, blanks-around-tables)
🤖 Prompt for AI Agents
Verify each finding against current code. Fix only still-valid issues, skip the
rest with a brief reason, keep changes minimal, and validate.
In `@plugins/confluence/skills/confluence-conventions/SKILL.md` around lines 40 -
47, Two Markdown tables (one starting with the header "| Content Type | Required
Labels | Optional Labels |" and the other the second table referenced in the
comment) lack surrounding blank lines and trigger MD058; fix by adding a single
blank line both immediately before and immediately after each table so each
table is separated from surrounding paragraphs and headings. Ensure you update
the blocks that include the "| Content Type | Required Labels | Optional Labels
|" header and the other table block so there is exactly one blank line above and
one blank line below each table.
There was a problem hiding this comment.
🧹 Nitpick comments (1)
plugins/confluence/evals/sync-meeting-notes.yaml (1)
45-51: ⚡ Quick winConsider adding assertions that verify successful Confluence interaction.
The current assertions only check for substring presence (
"meeting notes","Attendees","Action items"), which won't catch failures where the command produces output but fails to actually create or update the Confluence page.Since the maintainer requested "happy path" evals to exercise the promptfoo machinery, these basic assertions may be sufficient for the initial implementation. However, consider adding at least one assertion that confirms successful Confluence API interaction (e.g., checking for a success message or page URL in the output) to increase confidence that the command executed end-to-end correctly.
🤖 Prompt for AI Agents
Verify each finding against current code. Fix only still-valid issues, skip the rest with a brief reason, keep changes minimal, and validate. In `@plugins/confluence/evals/sync-meeting-notes.yaml` around lines 45 - 51, Add an assertion to verify a successful Confluence API interaction in the existing assert block (which currently contains icontains checks for "meeting notes", "Attendees", and "Action items"). For example, add an icontains or regex assertion that looks for a success message or page URL (e.g., "Page created", "Page updated", or a Confluence URL pattern like "confluence" or "atlassian.net") in the command output to confirm the page was actually created/updated rather than just containing text fragments.
🤖 Prompt for all review comments with AI agents
Verify each finding against current code. Fix only still-valid issues, skip the
rest with a brief reason, keep changes minimal, and validate.
Nitpick comments:
In `@plugins/confluence/evals/sync-meeting-notes.yaml`:
- Around line 45-51: Add an assertion to verify a successful Confluence API
interaction in the existing assert block (which currently contains icontains
checks for "meeting notes", "Attendees", and "Action items"). For example, add
an icontains or regex assertion that looks for a success message or page URL
(e.g., "Page created", "Page updated", or a Confluence URL pattern like
"confluence" or "atlassian.net") in the command output to confirm the page was
actually created/updated rather than just containing text fragments.
ℹ️ Review info
⚙️ Run configuration
Configuration used: Path: .coderabbit.yaml
Review profile: CHILL
Plan: Enterprise
Run ID: 3c9ff008-6d16-4b0f-949c-6a1686514164
📒 Files selected for processing (2)
plugins/confluence/evals/sync-meeting-notes.yamlplugins/confluence/skills/page-templates/SKILL.md
✅ Files skipped from review due to trivial changes (1)
- plugins/confluence/skills/page-templates/SKILL.md
Plugin Summary
The confluence plugin bridges the gap between Jira issue tracking and Confluence documentation. Today, several plugins in
the repo (jira:grooming, agendas:outcome-refinement) generate useful content but end with "copy this into Confluence
manually." This plugin eliminates that manual step by directly creating, searching, and publishing Confluence pages through
the MCP Atlassian tools that are already available.
Why it matters:
team. Automating that transition reduces friction and makes it more likely to actually happen.
already use ai-helpers with Jira.
search intent, extracting action items from raw notes) — not just wrapping API calls.
PR Details
Base repo: openshift-eng/ai-helpers (branch: main)
Head repo: mmorency2021/ai-helpers (branch: feat/confluence-plugin)
Title:
feat(confluence): add confluence plugin for page management and doc generation
Body:
Summary
confluenceplugin (v0.1.0) with 3 commands and 2 skillscreate-from-jira— reads a Jira epic/story and generates a structured Confluence page (design doc, feature spec,search— searches Confluence using natural language, Jira issue keys, or raw CQL, then ranks and summarizes resultsby relevance
sync-meeting-notes— takes meeting content (e.g., output fromjira:groomingoragendas:outcome-refinement) andpublishes it as a well-structured Confluence page with extracted action items, decisions, and attendees
Summary by CodeRabbit